from functools import wraps
from flask import request, jsonify
import jwt
from config import Config
from app.models import User

# 这是一个三层嵌套的装饰器模式

# 第一层：装饰器工厂函数，接收参数
def permission_required(module, operation):
    # 第二层：真正的装饰器，接收被装饰的函数
    def decorator(f):
        @wraps(f)
        # 第三层：包装函数，实现额外的功能
        def decorated_function(*args, **kwargs):
            # 获取token
            token = request.headers.get('Authorization')
            if not token:
                return jsonify({'message': '未登录', 'errcode': '-1'}), 401

            try:
                # 验证token
                if token.startswith('Bearer '):
                    token = token.split(' ')[1]
                data = jwt.decode(token, Config.SECRET_KEY, algorithms=['HS256'])
                user_id = data['user_id']
                
                # 获取用户
                user = User.query.get(user_id)
                if not user or not user.role:
                    return jsonify({'message': '无权限', 'errcode': '-1'}), 403

                # 检查权限
                has_permission = user.role.permissions.filter_by(
                    module=module,
                    operation=operation
                ).first() is not None

                if not has_permission:
                    return jsonify({'message': '无权限', 'errcode': '-1'}), 403
                return f(*args, **kwargs)
                
            except jwt.ExpiredSignatureError:
                return jsonify({'message': 'token过期', 'errcode': '-1'}), 401
            except jwt.InvalidTokenError:
                return jsonify({'message': 'token无效', 'errcode': '-1'}), 401
            
        return decorated_function
    return decorator